/*************************
 * 文件名：IOT_Engineer_Functionc.c
 * 描述：工程师对设备信息及密码进行操作
 * 功能：
 * 1.工程师操作界面，根据用户输入执行相应功能
 * 2.显示设备信息
 * 3.修改设备信息
 * 4.进行冒泡排序
 * 5.修改工程师密码
 * 创建人：IOT_王旭
 * 创建时间：2024/9/21/18点31分
 ************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "IOT_PI_Menu.h"
#include "IOT_Engineer_Function.h"
#include "IOT_Admin_Function.h"
#include "IOT_AdminFile.h"
#include "IOT_AccPassword.h"
/************宏定义***********/
#define SHOW_EQUIPMENT 1   // 显示设备信息
#define CHANGE_EQUIPMENT 2 // 修改设备状态
#define ENGINEER_MESSAGE 3 // 修改工程师密码
#define EXIT_ENGINEER 4    // 返回主界面
#define AWAY_ENGINEER 5    // 退出系统
/**************************
函数名称：IOT_Get_EngineerVal
描述：获取工程师输入的选项值
参数：无
返回值：用户输入的选项值，若输入有误则返回-1
****************************/
int IOT_Get_EngineerVal()
{
      unsigned int FVal = 0;
      printf("请输入选择:");
      scanf("%d", &FVal);

      if (FVal > 5)
      {
            printf("输入有误\n");
            return -1;
      }

      return FVal;
}
/**************************
函数名称：IOT_Engineer_Function
描述：根据工程师选择执行相应功能
参数：LinkList Head, EquipmentLink Arm
返回值：无
****************************/
void IOT_Engineer_Function(LinkList Head, EquipmentLink Arm)
{
      int result = -1; // 定义
      while (1)
      {
            IOT_Engineer_Menu(); // 显示工程师菜单
            result = IOT_Get_EngineerVal();
            switch (result)
            {
            case SHOW_EQUIPMENT: // 显示设备信息
            {
                  IOT_EngineerCheckLink(Arm);

                  break;
            }
            case CHANGE_EQUIPMENT: // 修改设备信息
            {
                  IOT_EngineerReviseLink(Arm);

                  break;
            }
            case ENGINEER_MESSAGE: // 修改工程师密码
            {
                  IOT_EnginEevPassLink(Head);
                  break;
            }
            case EXIT_ENGINEER: // 退出工程师界面
            {
                  return;
                  break;
            }
            case AWAY_ENGINEER: // 退出程序
            {
                  IOT_Exit();
                  break;
            }
            default:
                  printf("输入错误请重新输入\n");
                  break;
            }

            system("pause"); // 按任意键继续
            system("cls");   // 清屏
      } // 循环点
}

/**********************************************
 函数名称：IOT_EquipmentInitLink(EquipmentLink *Arm)
 描述：创建设备链表头节点
 参数：无
 返回值：无
 **************************************************/
int IOT_EngineerInitLink(EquipmentLink *Arm)
{

      *Arm = (EquipmentLink)malloc(sizeof(Equipment));

      if (NULL == *Arm)
      {
            printf("链表创建空间失败！！！\n");
            exit(ERROR);
      }

      (*Arm)->next = NULL;

      return OK;
}

/*************************
 函数名称：compareEquipmentBycount
 描述：比较两个设备结点的检修次数
 参数：Engineer* p, Equipment* q
 返回值：返回q->times - p->times的值
 *************************/
int compareEquipmentBycount(Equipment *p, Equipment *q)
{
      if (p == NULL || q == NULL)
      {
            return 0;
      }
      return q->count - p->count;
}

/*************************
函数名称：swapEquNodes
描述：交换两个设备结点的位置
参数：Engineer* a, Equipment* b
返回值：无
已完成
*************************/
void swapEquNodes(Equipment *a, Equipment *b)
{
      Equipment temp = *a;
      *a = *b;
      *b = temp;
      Equipment *tempNext = a->next; // 交换next结点的位置
      a->next = b->next;
      b->next = tempNext;
}

/*************************
函数名称：sortEngineersFromSecond(Equipment* start)
描述：从第二个结点开始冒泡排序设备链表
参数：Equipment* start
返回值：无
*************************/
void sortEquipmentFromSecond(EquipmentLink *start) // 从第2个结点开始排序，第一个结点存储管理员账号密码
{

      if (*start == NULL || (*start)->next == NULL) // 判断头结点和第一个结点是否为空
            return;
      int swapped; // 判断是否进行交换
      EquipmentLink current;
      EquipmentLink last = NULL; // 定义排序完后最后一个结点

      do
      {
            swapped = 0;
            current = *start;

            while (current != NULL && current->next != last)
            {
                  if (compareEquipmentBycount(current, current->next) > 0)
                  {
                        swapEquNodes(current, current->next);
                        swapped = 1;
                  }
                  else
                  {
                        current = current->next;
                  }
            }
            last = current;

      } while (swapped);
}
/*************************
函数名称：IOT_EngineerCheckLink
描述：显示设备信息
参数：EquipmentLink Arm
返回值：OK 或 ERROR
*************************/
int IOT_EngineerCheckLink(EquipmentLink Arm)
{
      IOT_Equipment_FileRead(Arm, "Equipment");
      EquipmentLink p = Arm->next;

      if (p == NULL)
      {
            printf("未添加设备！！！");
            return ERROR;
      }
      sortEquipmentFromSecond(&p);
      printf("----------------------------------------设备信息如下-------------------------------------------- \n");
      printf("\n");
      printf("设备\t\t设备安装地点\t\t设备状态\t\t历史检修次数\t\t检修日期\n");
      printf("\n");
      while (p != NULL) // 寻找链表中的最后一个节点
      {
            printf("%-16s", p->ID);
            printf("%-24s", p->gps);
            printf("%-24s", p->state);
            printf("%-24d", p->count);
            printf("%-20s\n", p->data);

            p = p->next;
      }
      return OK;
}
/********************************
函数名称：IOT_EngineerReviseLink
描述：修改设备信息
参数：EquipmentLink Arm
返回值：OK 或 ERROR
**************************/
int IOT_EngineerReviseLink(EquipmentLink Arm)
{
      char TrueEquipment[] = "设备已检修"; // 1
      char ERROREquipment[] = "设备故障";
      char OtherEquipment[] = "正在检修中";
      char input[20] = {0};
      char ID[20] = {0};
      IOT_Equipment_FileRead(Arm, "Equipment");
      EquipmentLink p = Arm->next;
      if (p == NULL)
      {
            printf("未添加设备！！！");
            return ERROR;
      }
      printf("请输入你要修改的设备编号：");
      scanf("%s", ID);

      while (p != NULL) // 寻找链表中的最后一个节点
      {
            if (0 == strcmp(ID, p->ID))
            {
                  printf("请输入该设备的状态(1为设备已检修/2为设备故障/3为正在检修中):");
                  fflush(stdin);
                  scanf("%s", input);
                  if (0 == strcmp(input, "1"))
                  {
                        strcpy(p->state, TrueEquipment);
                        p->count++;
                  }
                  else if (0 == strcmp(input, "2"))
                  {
                        strcpy(p->state, ERROREquipment);
                  }
                  else if (0 == strcmp(input, "3"))
                  {
                        strcpy(p->state, OtherEquipment);
                  }
                  else
                  {
                        printf("输入错误，请重新输入！！！");
                        return ERROR;
                  }
                  printf("\n");
                  printf("-----请确认信息-----\n");
                  printf("\n");
                  printf("设备状态已更新为:%s\n", p->state);
                  printf("\n");
                  IOT_Equipment_FileWrite(Arm, "Equipment");

                  return OK;
            }

            p = p->next;
      }
      printf("查无此设备！！！");
}

/************************
函数名称：  IOT_Exit
描述：  退出程序
返回值：无
ps:完成
***************************/
void IOT_Exit()
{
      exit(0);
}